package com.hxht.storage.server.service;

import java.util.Date;
import java.util.List;

import com.hxht.storage.server.bean.ManualRecordBean;
import com.hxht.storage.server.bean.NvrRegisteBean;
import com.hxht.storage.server.bean.NvrUpdateBean;
import com.hxht.storage.server.bean.PlanRecordParamBean;
import com.fxdigital.nvr.FindCondition;
import com.fxdigital.nvr.FindResult;
import com.hxht.storage.server.pojo.NvrDeviceInfo;
import com.hxht.storage.server.pojo.NvrIpchannelInfo;
import com.hxht.storage.server.pojo.PlanRecordInfo;
import com.hxht.storage.server.pojo.VideoManualRecord;

public interface NvrDeviceService {

	/** 注册NVR设备 */
	boolean registerNvrDevice(NvrRegisteBean dvrDevice);
	
	/** 获取存储服务器 管辖的所有 nvr ip通道信息 */
	List<NvrIpchannelInfo> getAllNvrIpchannel();
	
	/** 获取存储服务器 管辖的空闲 nvr ip通道信息 */
	List<NvrIpchannelInfo> getIdleNvrIpchannel();
	
	/** 从 存储服务器 管辖的所有 nvr ip通道信息中选择一个来进行录像*/
	NvrIpchannelInfo selectOneIpchannelToRecord(ManualRecordBean recordBean);
	
	/** 创建service时，从数据库中读取nvr信息，并判断是否在线，得到在线nvr的session句柄保存 */
	void init();
	
	/** 开始手工录像 */
	VideoManualRecord startManualRecord(ManualRecordBean recordBean);
	
	/**
	 * 手工录像停止 
	 * @param recording
	 * @param unbindIpchannel 停止录像时，是否释放相应的nvr ip通道
	 * @return
	 */
	boolean stopManualRecord(VideoManualRecord recording, boolean unbindIpchannel);
	
	/** 初始化nvr的ip通道 */
	boolean initScanIpchannel(String sn);
	
	/** 解除nvr的某一ip通道 */
	boolean unbindIpchannel(String nvrIp, int channel);
	
	/** 获得当前注册的所有NVR */
	List<NvrDeviceInfo> getAllNvr();
	
	/** 获得某一NVR的所有ip通道信息 */
	List<NvrIpchannelInfo> getIpchannelOfNvr(String nvrIp);
	
	/** 扫描某一nvr，并获得会话句柄<br/>
	 * 返回值 为 该nvr是否在线
	 *  */
	boolean scanNvr(String nvrIp);
	
	/** 获得nvr当前系统时间 */
	Date getCurrentNvrTime(String nvrIp);
	
	/** 判断当前是否有可用的空闲ipchannel,并返回可用ipchannel所属的nvr ip */
	String hasIdleIpchannel();

	/** 开始计划录像 */
	PlanRecordInfo startPlanRecord(PlanRecordInfo record);
	
	/** 停止计划录像 */
	boolean stopPlanRecord(PlanRecordInfo record);
	
	/** 根据ip通道号、文件类型、时间段， 查找录像文件 */
	List<FindResult> searchRecordFileByDevice(String nvrIp, FindCondition findCondition);
	
	/** 根据nvrIp获得NvrDeviceInfo */
	NvrDeviceInfo getNvrDevice(String nvrIp);

	/** 更新nvr的登录信息、IP地址 */
	void updateNvr(NvrUpdateBean nvr);

	/** 根据nvr的sn号，删除NVR */
	void deleteNvr(String sn);

	/** 在指定的  nvr ip通道上，进行手工录像*/
	VideoManualRecord startManualRecord(ManualRecordBean recordBean,
				String nvrIp, Integer ipchannel);

	/** 手工录像 定时停止 的 执行方法体 */
	boolean stopManualRecord(String sn, int channel, boolean isUnbindIpchannel);

	/** 更新IP设备计划录像的录像时间 */
	boolean updatePlanRecord(String sn, int ipchannel,
			PlanRecordParamBean updateParam, boolean needSchedule);

	/** 根据 nvr sn号、 磁盘序列号，格式化nvr的某一块磁盘 */
	boolean formatDisk(String sn, int diskIndex);
	
}
